package com.blog.cmrpersonalblog.mapper;

import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.blog.cmrpersonalblog.entity.ArticleTag;
import com.blog.cmrpersonalblog.entity.ArticleTagRelation;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;

import java.util.List;

/**
 * 文章标签关联Mapper接口
 */
@Mapper
public interface ArticleTagRelationMapper extends BaseMapper<ArticleTagRelation> {

    /**
     * 根据文章ID查询标签列表
     * @param articleId 文章ID
     * @return 标签列表
     */
    List<ArticleTag> selectTagsByArticleId(@Param("articleId") Long articleId);

    /**
     * 根据标签ID查询文章ID列表
     * @param tagId 标签ID
     * @return 文章ID列表
     */
    List<Long> selectArticleIdsByTagId(@Param("tagId") Long tagId);

    /**
     * 根据标签ID列表查询文章ID列表
     * @param tagIds 标签ID列表
     * @return 文章ID列表
     */
    List<Long> selectArticleIdsByTagIds(@Param("tagIds") List<Long> tagIds);

    /**
     * 批量插入文章标签关联
     * @param relations 关联列表
     * @return 插入数量
     */
    int batchInsert(@Param("relations") List<ArticleTagRelation> relations);

    /**
     * 根据文章ID删除所有标签关联
     * @param articleId 文章ID
     * @return 删除数量
     */
    int deleteByArticleId(@Param("articleId") Long articleId);

    /**
     * 根据标签ID删除所有文章关联
     * @param tagId 标签ID
     * @return 删除数量
     */
    int deleteByTagId(@Param("tagId") Long tagId);

    /**
     * 统计文章的标签数量
     * @param articleId 文章ID
     * @return 标签数量
     */
    int countTagsByArticleId(@Param("articleId") Long articleId);

    /**
     * 统计标签关联的文章数量
     * @param tagId 标签ID
     * @return 文章数量
     */
    int countArticlesByTagId(@Param("tagId") Long tagId);

    /**
     * 查询热门标签（按文章数量排序）
     * @param limit 限制数量
     * @return 标签列表
     */
    List<ArticleTag> selectHotTags(@Param("limit") int limit);

    /**
     * 查询文章的标签ID列表
     * @param articleId 文章ID
     * @return 标签ID列表
     */
    List<Long> selectTagIdsByArticleId(@Param("articleId") Long articleId);

    /**
     * 更新标签的使用次数
     * @param tagId 标签ID
     * @param increment 增量（可以为负数）
     * @return 更新数量
     */
    int updateTagUseCount(@Param("tagId") Long tagId, @Param("increment") int increment);

    /**
     * 批量更新标签的使用次数
     * @param tagIds 标签ID列表
     * @param increment 增量（可以为负数）
     * @return 更新数量
     */
    int batchUpdateTagUseCount(@Param("tagIds") List<Long> tagIds, @Param("increment") int increment);
}